package com.kotodama.domain.entities;

import com.kotodama.domain.enums.TenantStatus;
import com.kotodama.domain.events.DomainEvent;
import com.kotodama.domain.exceptions.TenantNameAlreadyExistsException;
import com.kotodama.domain.valueobjects.TenantName;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Filter;

import java.util.ArrayList;
import java.util.List;

/**
 * 租户聚合根
 * 管理租户的生命周期和业务规则
 */
/**
 * 租户聚合根
 * 管理租户的生命周期和业务规则
 */
@Entity
@Table(name = "tenant")
@Getter
@NoArgsConstructor
// 注意：Tenant 表本身不需要租户过滤器，因为它存储所有租户信息
public class Tenant extends BaseEntity {

    @Id
    private String id;

    @Embedded
    @AttributeOverride(name = "value", column = @Column(name = "name", nullable = false, unique = true))
    private TenantName name;

    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false)
    private TenantStatus status;
    
    public String getId() {
        return id;
    }
    
    public TenantName getName() {
        return name;
    }
    
    public TenantStatus getStatus() {
        return status;
    }

    // 领域事件列表（不持久化）
    @Transient
    private final List<DomainEvent> domainEvents = new ArrayList<>();

    /**
     * 创建新租户
     * 
     * @param name   租户名称
     * @param status 租户状态
     */
    public Tenant(String id, TenantName name, TenantStatus status) {
        this.id = id;
        this.name = name;
        this.status = status != null ? status : TenantStatus.ACTIVE;
    }
    
    public Tenant(TenantName name, TenantStatus status) {
        this.name = name;
        this.status = status != null ? status : TenantStatus.ACTIVE;
    }

    /**
     * 激活租户
     */
    public void activate() {
        if (this.status == TenantStatus.ACTIVE) {
            throw new IllegalStateException("租户已经是激活状态");
        }
        this.status = TenantStatus.ACTIVE;
    }

    /**
     * 停用租户
     */
    public void deactivate() {
        if (this.status == TenantStatus.INACTIVE) {
            throw new IllegalStateException("租户已经是停用状态");
        }
        this.status = TenantStatus.INACTIVE;
    }

    /**
     * 暂停租户
     */
    public void suspend() {
        if (this.status == TenantStatus.SUSPENDED) {
            throw new IllegalStateException("租户已经是暂停状态");
        }
        this.status = TenantStatus.SUSPENDED;
    }

    /**
     * 更新租户名称
     * 
     * @param newName 新名称
     */
    public void updateName(TenantName newName) {
        if (newName == null) {
            throw new IllegalArgumentException("租户名称不能为空");
        }
        this.name = newName;
    }

    /**
     * 检查租户是否处于活跃状态
     * 
     * @return 是否活跃
     */
    public boolean isActive() {
        return this.status == TenantStatus.ACTIVE;
    }

    /**
     * 添加领域事件
     * 
     * @param event 领域事件
     */
    public void addDomainEvent(DomainEvent event) {
        this.domainEvents.add(event);
    }

    /**
     * 清除领域事件
     */
    public void clearDomainEvents() {
        this.domainEvents.clear();
    }

    /**
     * 获取领域事件列表
     * 
     * @return 事件列表
     */
    public List<DomainEvent> getDomainEvents() {
        return new ArrayList<>(domainEvents);
    }
}
